LeetCode-47-全排列 II
in LeetCode with 0 comment

LeetCode-47-全排列 II

in LeetCode with 0 comment

原题地址:全排列 II

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

逐字插入

前一题 基本一致,只是因为数字可能重复,所以最后的排列需要去重:

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
const permuteUnique1 = function(nums) {
    let result = [[nums[0]]]; // 一个数字的排列只有一种
    for (let i = 1; i < nums.length; i ++) {
        let array = [];
        for (let j = 0; j < result.length; j ++) {
            for (let k = 0; k <= i; k ++) {
                // 对前面数字的每一种排列,将当前数字插入到这些排列中的每一个位置
                let temp = [...result[j]];
                temp.splice(k,0,nums[i]);
                array.push(temp);
            }
        }
        result = array;
    }
    // 利用set去重
    return [...new Set(...[result.map(item => item.join(','))])].map(item => item.split(',').map(str => Number(str)));
};

测试:

let start = new Date();
const test = permuteUnique1;
console.log(test([1,1,2])); // [ [ 2, 1, 1 ], [ 1, 2, 1 ], [ 1, 1, 2 ] ]
console.log(new Date().getTime() - start.getTime()); // 9

时间复杂度: 时间复杂度为$O(N!)$
空间复杂度: 最坏情况下没有重复数字,空间复杂度为$O(N!)$